/*
 * CS_REQ_SELF_DEAD.cpp
 *
 *  Created on: 2013. 10. 12.
 *      Author: jjaehuny
 */




#include "../../Command.h"

#include "../../User.h"
#include "../../NLogic/Static.h"
#include "../../NLogic/Battle.h"
#include "../../NLogic/Monster.h"
#include "../../NLogic/Space.h"

namespace ProjectZ { namespace NCommand {

void Command::CS_REQ_SELF_DEAD(User * pUser, ::Network::Packet *pPacket)
{
	/*
	 *
	// 즉시 죽음 처리 자폭몹은 client에서 ZNO_CS_REQ_SELF_DEAD 요청함 요청자를 제외한 다른 유저에게 전달
	// ZNO_SC_REQ_SELF_DEAD 던젼 플레이에서 재접속 시 이미 죽은 몬스터에 대해 내려줌
	CS_REQ_SELF_DEAD	0x0522
	{
		u8	u8is_monster;		// 공격자의 몬스터여부 (0 : 주인공 1: 몬스터)
		u32 u32gid;
	}

	SC_REQ_SELF_DEAD	0x0523
	{
		u8	u8is_monster;		// 공격자의 몬스터여부 (0 : 주인공 1: 몬스터)
		u32 u32gid;
	}
	 */

	NLogic::Space * pSpace = pUser->GetSpace();
	if (NULL == pSpace)
	{
		DEBUGLOG("CS_REQ_SELF_DEAD NULL == pWorld");
		return;
	}

	if (false == pSpace->IsDungeon())
	{
		DEBUGLOG("CS_REQ_SELF_DEAD space is not single or party dungeion");
		return;
	}

	PREPARE_PACKET;

	uint8_t u8is_monster = 0;
	uint32_t u32gid = 0;

	* pPacket >> u8is_monster >> u32gid;

	NLogic::Monster * pMonster = pSpace->GetMonster(u32gid);
	if (pMonster == NULL)
	{
		DEBUGLOG("CS_REQ_SELF_DEAD pMonster == NULL gid : %d", u32gid);
		return;
	}

	pSpace->RemoveMonster(u32gid);

	::Network::Packet * pAck = ::Network::GETPACKETPOOL()->SEND_NEW();
	* pAck <<  u8is_monster << u32gid;
	pAck->MakePacket(CMD_SC_REQ_SELF_DEAD);
	pSpace->SendAll(pAck);

	if (NLogic::Monster::MonsterType::MONSTER == pMonster->GetMonsterType())
	{
		if (pUser->GetSpace()->GetMonsterCount() == 0)
		{
			::Network::Packet * pNoti = ::Network::GETPACKETPOOL()->SEND_NEW();
			*pNoti << (char)1;
			pNoti->MakePacket(CMD_SN_DUNGEON_MAP_CLEAR);
			pUser->GetSpace()->SendAll(pNoti);
		}
	}
}

} /*NCommand*/ } /*ProjectZ*/
